package com.yonyou.gmmc.service.points.eventhandle;

import org.marketing.common.dto.EventDataDTO;
import org.marketing.common.event.BizEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.yonyou.gmmc.service.points.exception.PointsException;
import com.yonyou.gmmc.service.points.service.PointsPayService;
import com.yonyou.gmmc.service.points.util.SpringUtil;

public abstract class AbstractEventHandle {

	private Logger logger = LoggerFactory.getLogger(this.getClass());

	protected String backInfo = "";

	public String getBackInfo() {
		return backInfo;
	}

	/**
	 * 具体的业务描述
	 * 
	 * @return
	 */
	protected abstract String getHandleInfo();

	/**
	 * 预处理数据
	 * 
	 * @param event
	 * @return
	 */
	protected abstract EventDataDTO preTransform(BizEvent event);

	/**
	 * 具体处理的逻辑
	 * 
	 * @param event
	 * @return
	 */
	protected abstract boolean pay(EventDataDTO data) throws PointsException;

	/**
	 * 处理完成后进行的逻辑判断
	 */
	private  void afterPay(BizEvent event){
		PointsPayService pointsPayService=(PointsPayService)SpringUtil.getBean("pointsPayService");
		pointsPayService.insertHandleLog(event);
	}
	
	
	/**
	 * 判断是否要处理，目前用于过滤重复发送过来的事件
	 * 
	 * @param event
	 * @return
	 */
	private boolean preCheck(BizEvent event){
		PointsPayService pointsPayService=(PointsPayService)SpringUtil.getBean("pointsPayService");
		if(pointsPayService.queryEventNum(event)>0){
			return false;
		}
		return true;
	}

	/**
	 * 事件处理
	 * 
	 * @param event
	 * @return
	 */
	public HandleResult handleing(BizEvent event) {
		logger.info("积分服务开始处理事件，对应处理的逻辑为【" + this.getHandleInfo() + "】");

		HandleResult handleResult = new HandleResult();
		
		try {
			if(!preCheck(event)){
				handleResult.setHandle(true);
				handleResult.setPayed(false);//处理积分发放，是否发放了积分
				handleResult.setMessage("重复的事件，不进行处理");//返回的消息
				return handleResult;
			}
			
			EventDataDTO o = this.preTransform(event);//预处理 转换业务对象
			handleResult.setHandle(true);
			handleResult.setPayed(pay(o));//处理积分发放，是否发放了积分
			handleResult.setMessage(getBackInfo());//返回的消息
			//新增事件处理记录
			afterPay(event);
		} catch (PointsException e) {
			logger.error("积分事件处理失败，异常" + e);
			handleResult.setHandle(false);
			handleResult.setPayed(false);
			handleResult.setMessage(getBackInfo());
			//e.printStackTrace();
		}

		return handleResult;

	}

}
